package Problem.project;
/*
    第一种解决线程安全的方法：同步代码块(在run方法中创建)
    解决思路：当多个线程进去到run（）方法中时，先抢到执行权的线程会获取到锁对象，进到同步代码块中执行，而其他的线程进入run（）
            方法中后发现没有锁对象，就等待获得锁对象的线程执行完后释放锁对象，他再使用该锁对象执行同步代码中的代码，一次进行
    总结：同步中的线程没有执行完毕不会释放锁，同步外的线程没有锁进不去。

        语法：synchronized(锁对象){
                需要同步的代码块（共享的代码）
             }

     注意：1.代码块中的锁对象可以是任意的对象（只能创建一个对象）
          2.但必须保证多个线程使用的是同一个锁锁对象
          3.锁对象的作用：把同步代码块锁住，只让一个线程在同步代码块中执行，只有当当前线程执行完，其他一个线程才可以使用代码
                        块中的代码，一个一个依次进行
 */
public class MyProblem implements Runnable{
    private int ticket = 100; //总共100张票
    //创建一个任意对象（只能是一个对象）
    Object obj = new Object();
    @Override
    public void run() {

        while (true){
            //同步代码块

                if(ticket > 0){
                    try {
                        Thread.sleep(100); //睡眠100毫秒在启用线程
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized(obj){
                    System.out.println("第"+ticket+"张票");
                    ticket--;

                    }
                }
                else {
                    break;
                }
        }
    }
}
